package com.wdzl.frame;

import com.wdzl.util.ImageUtil;

import java.util.*;
import javax.swing.*;

/**
 * 卡牌模型：
 * 随机卡牌图案
 * 随机抽取卡牌放入卡牌池
 * 计算堆叠算法.....
 */
public class CardModel {
    private static Random random = new Random();
    private static String imgName = "刷子;剪刀;叉子;手套;水桶;火;玉米;球;瓶子;白菜;稻草;胡萝卜;苹果;铃铛;肉腿;青草";
    private static String[] imgNames;

    // 卡牌池列表
    private static LinkedList<Card> allCardPool;
    // 卡牌张数
    private static int cardTotalCount = 150; // 3的倍数
    // 本次关卡使用的图标数
    private static int cardTypeCount = 6;
    // 存放抽取的本关卡使用的图案池
    private static String[] cardUsed;

    //右边一个区域的卡牌池
    public static List<Card> rightArea1List;
    private static int rightArea1Count = 21;


    //左边边一个区域的卡牌池
    public static List<Card> leftArea1List;
    private static int leftArea1Count = 21;

    //左边边一个区域的卡牌池
    public static List<Card> leftArea2List;
    private static int leftArea2Count = 21;

    //右边上一个区域的卡牌池
    public static List<Card> rightArea2List;
    private static int rightArea2Count = 21;

    //中间区域 塔形区域卡片列表 一压四
    public static List<Card> towerList;

    //卡槽池列表
    public static List<Card> selectedList;

    static{
        initData();
    }

    private static void initData(){
        selectedList = new ArrayList<>();
        // 获取所有卡片图标名
        imgNames = imgName.split(";");
        allCardPool = new LinkedList<>();
        cardUsed = new String[cardTypeCount];

        //打乱图片名数组顺序
        Collections.shuffle(Arrays.asList(imgNames));

        // 开始随机抽取图案
        for (int i = 0; i < cardUsed.length; i++) {
//            //在所有的卡片类型池中抽取6张
//            int randIndex = random.nextInt(imgNames.length);

            //直接从打乱的卡片池中提取指定张数卡牌即可，放入使用的卡片图标池中
            cardUsed[i] = imgNames[i];
        }

        // 上面的图案类型池抽取完成后，再初始化卡牌池
        for (int i = 0; i < cardTotalCount/3; i++) {
            int randIndex = random.nextInt(cardUsed.length);
            //实例化卡牌
            ImageIcon imageIcon = ImageUtil.getImageIconByImgs(cardUsed[randIndex]);
            // 防止死局，每次抽三张相同的牌 放入卡牌池
            for (int j = 0; j < 3; j++) {
                Card card = new Card(imageIcon);
                card.setSize(imageIcon.getIconWidth(),imageIcon.getIconHeight());
                //为了判断是否为相同图案，消卡时用
                card.setName(cardUsed[randIndex]);
                allCardPool.add(card);
            }
        }

        //打乱卡牌池  因为上面的三张三张提取，不打乱的话，三张会是连续的
        Collections.shuffle(allCardPool);

        // 中间塔型区域 这里暂时固定层高 55张
        towerList = new ArrayList<>();
        initCardToAreaList(towerList,55);

        // 再从卡牌池中抽取右边区域1中的卡牌
        rightArea1List = new ArrayList<>();
        initCardToAreaList(rightArea1List,rightArea1Count);

        // 再从卡牌池中抽取左边边区域1中的卡牌
        leftArea1List = new ArrayList<>();
        initCardToAreaList(leftArea1List,leftArea1Count);

        // 再从卡牌池中抽取右边区域2中的卡牌
        rightArea2List = new ArrayList<>();
        initCardToAreaList(rightArea2List,rightArea2Count);

        // 再从卡牌池中抽取左边边区域2中的卡牌
        leftArea2List = new ArrayList<>();
        initCardToAreaList(leftArea2List,leftArea2Count);


    }

    private static void initCardToAreaList(List<Card> list,int count){
        for (int i = 0; i < count ; i++) {
            if(allCardPool.isEmpty()){
                return;
            }
            //从卡牌池中移除一张牌 放入区域卡卡牌池中
            Card card = allCardPool.pop();
            // 放入区域卡牌池中
            list.add(card);
        }
    }
}
